package com.wanger.swc.util.task;

import java.util.Date;
import java.util.concurrent.*;

/**
 * 动态定时任务工具类
 *
 * @Author: wanger
 * @Date: 2025/8/14 17:38
 */
public class DynamicTaskScheduler {

    private static final ConcurrentHashMap<String, DynamicTaskScheduler> instances = new ConcurrentHashMap<>();

    public static DynamicTaskScheduler getInstance(String taskName) {
        return instances.computeIfAbsent(taskName, k -> new DynamicTaskScheduler(taskName));
    }

    // 任务调度器（单线程）
    private final ScheduledExecutorService scheduler;
    // 存储任务键和对应的Future
    private final ConcurrentHashMap<String, ScheduledFuture<?>> taskMap;

    private DynamicTaskScheduler(String taskName) {
        this.scheduler = Executors.newSingleThreadScheduledExecutor(task -> new Thread(task, taskName));
        this.taskMap = new ConcurrentHashMap<>();
    }

    /**
     * 提交或更新定时任务
     *
     * @param key      任务唯一标识
     * @param task     任务逻辑（Runnable）
     * @param execTime 执行时间
     */
    public void submitTask(String key, Runnable task, Date execTime) {
        // 1. 取消旧任务（如果存在）
        cancelTask(key);

        // 2. 计算延迟时间（毫秒）
        long delay = execTime.getTime() - System.currentTimeMillis();
        if (delay < 0) {
            delay = 0; // 如果已过时，立即执行
        }

        // 3. 提交新任务
        ScheduledFuture<?> future = scheduler.schedule(() -> {
            try {
                task.run(); // 执行任务
            } finally {
                taskMap.remove(key); // 执行后自动移除
            }
        }, delay, TimeUnit.MILLISECONDS);

        // 4. 记录任务
        taskMap.put(key, future);
    }

    /**
     * 取消并删除任务
     *
     * @param key 任务唯一标识
     */
    public void cancelTask(String key) {
        ScheduledFuture<?> future = taskMap.get(key);
        if (future != null) {
            future.cancel(false); // 不中断正在执行的任务
            taskMap.remove(key);
        }
    }

    /**
     * 关闭调度器（释放资源）
     */
    public void shutdown() {
        scheduler.shutdownNow();
        taskMap.clear();
    }
}
